//设计一个算法收集某些股票的每日报价，并返回该股票当日价格的 跨度 。
//
// 当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数（从今天开始往回数，包括今天）。
//
//
// 例如，如果未来 7 天股票的价格是 [100,80,60,70,60,75,85]，那么股票跨度将是 [1,1,1,2,1,4,6] 。
//
//
// 实现 StockSpanner 类：
//
//
// StockSpanner() 初始化类对象。
// int next(int price) 给出今天的股价 price ，返回该股票当日价格的 跨度 。
//
//
//
//
// 示例：
//
//
//输入：
//["StockSpanner", "next", "next", "next", "next", "next", "next", "next"]
//[[], [100], [80], [60], [70], [60], [75], [85]]
//输出：
//[null, 1, 1, 1, 2, 1, 4, 6]
//
//解释：
//StockSpanner stockSpanner = new StockSpanner();
//stockSpanner.next(100); // 返回 1
//stockSpanner.next(80);  // 返回 1
//stockSpanner.next(60);  // 返回 1
//stockSpanner.next(70);  // 返回 2
//stockSpanner.next(60);  // 返回 1
//stockSpanner.next(75);  // 返回 4 ，因为截至今天的最后 4 个股价 (包括今天的股价 75) 都小于或等于今天的股价。
//stockSpanner.next(85);  // 返回 6
//
//
//
//
// 提示：
//
//
// 1 <= price <= 10⁵
// 最多调用 next 方法 10⁴ 次
//
//
// Related Topics 栈 设计 数据流 单调栈 👍 327 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
// 即前日股票价格前面有多少个小于或等于他的（包括他 且需要连续）
/*
另外一个容易想到的想法是使用「单调栈」，栈内以二元组(idx,price) 形式维护比当前元素 price 大的元素。

每次执行 next 操作时，从栈顶开始处理，将所有满足「不大于 price」的元素进行出栈，从而找到当前元素 price 左边最近一个比其大的位置。

 */
class StockSpanner {
    //? [0] 用于记录本元素的跨度 [1]记录price
    stack : any[][] = [[Infinity,Infinity]]
    res : number
    next(price: number): number {
        this.res = 1
        //? 此时栈顶价格是小于等于当前price的 则需要出栈计算
        while (this.stack.length > 0 && this.stack[this.stack.length - 1][1] <= price) {
            let index = this.stack[this.stack.length - 1][0]
            this.stack.pop()
            //? 加上前面计算过的跨度 作为本次循环此元素的跨度
            this.res += index
        }
        //? 单调递减 入栈  由于我的栈预先占了一个[Infinity,Infinity] 保证不会出现栈空的情况 这里必须在while后以将本单调递减的和while后单调递减的入栈
        if (this.stack.length > 0 && this.stack[this.stack.length - 1][1] > price) {
            this.stack.push([this.res, price])
        }
        return this.res
    }
}


/**
 * Your StockSpanner object will be instantiated and called as such:
 * var obj = new StockSpanner()
 * var param_1 = obj.next(price)
 */
//leetcode submit region end(Prohibit modification and deletion)
